#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
微信小程序配置工具
用于设置微信小程序的AppID和Secret
"""

import os
import sys
import re

def update_env_file(appid, secret):
    """更新.env文件中的微信配置"""
    env_file = '.env'
    
    if not os.path.exists(env_file):
        print("❌ .env文件不存在，请先运行数据库配置工具")
        return False
    
    # 读取现有配置
    with open(env_file, 'r', encoding='utf-8') as f:
        content = f.read()
    
    # 更新微信配置
    content = re.sub(r'WECHAT_APPID=.*', f'WECHAT_APPID={appid}', content)
    content = re.sub(r'WECHAT_SECRET=.*', f'WECHAT_SECRET={secret}', content)
    
    # 写回文件
    with open(env_file, 'w', encoding='utf-8') as f:
        f.write(content)
    
    print("✅ .env文件已更新")
    return True

def update_database_config(appid, secret):
    """更新数据库中的微信支付配置"""
    try:
        from app import create_app
        from app.models.payment_config import PaymentConfig
        from app import db
        
        app = create_app('development')
        with app.app_context():
            # 查找或创建微信支付配置
            config = PaymentConfig.query.filter_by(payment_method='wechat').first()
            
            if config:
                # 更新现有配置
                config.wechat_app_id = appid
                config.is_enabled = True
                config.is_sandbox = False  # 设为生产模式
                print("✅ 更新了现有的微信配置")
            else:
                # 创建新配置
                config = PaymentConfig(
                    name='微信小程序支付配置',
                    payment_method='wechat',
                    wechat_app_id=appid,
                    is_enabled=True,
                    is_sandbox=False
                )
                db.session.add(config)
                print("✅ 创建了新的微信配置")
            
            db.session.commit()
            return True
            
    except Exception as e:
        print(f"❌ 更新数据库配置失败: {e}")
        return False

def validate_appid(appid):
    """验证微信AppID格式"""
    if not appid:
        return False, "AppID不能为空"
    
    if not appid.startswith('wx'):
        return False, "AppID必须以'wx'开头"
    
    if len(appid) != 18:
        return False, "AppID长度必须为18位"
    
    return True, "AppID格式正确"

def validate_secret(secret):
    """验证微信Secret格式"""
    if not secret:
        return False, "Secret不能为空"
    
    if len(secret) != 32:
        return False, "Secret长度必须为32位"
    
    return True, "Secret格式正确"

def test_wechat_config(appid, secret):
    """测试微信配置是否有效"""
    import requests
    
    try:
        # 使用测试code测试配置
        test_code = "test"
        url = f'https://api.weixin.qq.com/sns/jscode2session?appid={appid}&secret={secret}&js_code={test_code}&grant_type=authorization_code'
        
        response = requests.get(url, timeout=10)
        result = response.json()
        
        # 检查返回结果
        if 'errcode' in result:
            if result['errcode'] == 40013:
                print("✅ 微信配置有效（AppID和Secret匹配）")
                return True
            elif result['errcode'] == 40001:
                print("❌ AppID无效")
                return False
            elif result['errcode'] == 40002:
                print("❌ Secret无效")
                return False
            else:
                print(f"⚠️  微信API返回: {result.get('errmsg', '未知错误')}")
                return True  # 其他错误可能是code无效，但配置可能是对的
        else:
            print("✅ 微信配置测试成功")
            return True
            
    except Exception as e:
        print(f"⚠️  网络测试失败: {e}")
        return True  # 网络问题不代表配置错误

def main():
    print("🔧 微信小程序配置工具")
    print("=" * 50)
    
    # 获取参数
    if len(sys.argv) >= 3:
        appid = sys.argv[1]
        secret = sys.argv[2]
    else:
        print("请输入微信小程序配置信息：")
        appid = input("微信小程序AppID: ").strip()
        secret = input("微信小程序Secret: ").strip()
    
    # 验证输入
    valid, msg = validate_appid(appid)
    if not valid:
        print(f"❌ {msg}")
        return
    
    valid, msg = validate_secret(secret)
    if not valid:
        print(f"❌ {msg}")
        return
    
    print(f"\n📋 配置信息:")
    print(f"AppID: {appid}")
    print(f"Secret: {secret[:8]}****{secret[-4:]}")
    
    # 测试配置
    print("\n🧪 测试微信配置...")
    if not test_wechat_config(appid, secret):
        print("❌ 微信配置测试失败，请检查AppID和Secret是否正确")
        choice = input("是否继续配置？(y/N): ").strip().lower()
        if choice != 'y':
            return
    
    # 更新配置
    print("\n🔄 更新配置...")
    
    # 更新.env文件
    if update_env_file(appid, secret):
        print("✅ 环境变量配置已更新")
    
    # 更新数据库配置
    if update_database_config(appid, secret):
        print("✅ 数据库配置已更新")
    
    print("\n🎉 微信小程序配置完成！")
    print("\n📋 下一步操作：")
    print("1. 重启应用服务: python run.py")
    print("2. 测试注册接口")
    print("3. 检查小程序端的域名配置")

if __name__ == '__main__':
    main() 